package com.kaguya.template;

/**
 * 行为型：模板方法模式：
 * 定义算法框架，并将一些步骤延迟给子类去实现。
 * 通过该方法，子类可以重新定义某些步骤的实现，而不会破坏原本的结构
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 冲咖啡和冲茶的步骤大致相同，但是其中有细节不同
         */
        CaffeineBeverage coffeeB = new CoffeeBeverage();
        coffeeB.prepareRecipe();
        System.out.println("-------------------------");
        CaffeineBeverage teaB = new TeaBeverage();
        teaB.prepareRecipe();
    }
}
/**
 * 抽象类，沏饮品
 */
abstract class CaffeineBeverage {

    final void prepareRecipe() {
        boilWater();
        brew();
        addCondiments();
        pourInCup();
    }

    void boilWater() {
        System.out.println("boil Water");
    }

    public abstract void brew();

    abstract void addCondiments();

    public void pourInCup() {
        System.out.println("pour In Cup");
    }
}

/**
 * 沏咖啡实现
 */
class CoffeeBeverage extends CaffeineBeverage {

    @Override
    public void brew() {
        System.out.println("coffee brew");
    }

    @Override
    void addCondiments() {
        System.out.println("coffee addCondiments");
    }
}

/**
 * 沏茶实现
 */
class TeaBeverage extends CaffeineBeverage {

    @Override
    public void brew() {
        System.out.println("tea brew");
    }

    @Override
    void addCondiments() {
        System.out.println("tea addCondiments");
    }
}
